Testing is a normal part of the software development process. Software under development is commonly tested by providing various types of input to the software and observing the software's behavior. The input may be provided by a person. For example, in an interactive application, such as a web application, a person could test the application by manually providing various types of input to the software through a browser. However, in many cases, the process of providing input is automated.
There are various test engines that automate testing of software (e.g., Hewlett Packard QuickTest Pro, Rational Functional Tester, and Borland Silk Test). These test engines are typically based on record-and-playback-type techniques. When a complete version of the software to be tested has been produced, a tester may develop test scenarios and create scripts that may be “replayed” to interact with the software. These scripts may be created by using a scripting language to enter instructions for interacting with the software, or by recording a tester's actual interactions with the software and storing the recorded results in a scripting language. In these kinds of testing systems, the script tends to be specific to one test engine, and is not easily ported for use by different test engines.
Moreover, the nature of a record-and-playback approach is that it typically presumes the existence of a finished piece of software before a test is created. In the software development cycle, testing is the phase that occurs between construction and delivery. Since the delivery date is normally fixed and construction usually takes longer than expected, time may be taken away from the testing phase to meet the delivery date. If development of a test starts after construction of the software is complete, then testing may be inadequate.